Deberías estar abriendo este .qmd dentro de un proyecto en R Studio.
Modifica en el documento .qmd tus datos personales (nombre e ID) situados en la cabecera del archivo. No toques nada más en la cabecera (ten en cuenta que he incluido embed-resources: true para que todo quede contenido en un único html sin archivos extra, y theme: [style.scss] para darle un estilo cuco a la entrega con el archivo style.scss en la carpeta).
Asegúrese, ANTES de seguir editando el documento, de que el archivo .qmd se renderiza correctamente y se genera el correspondiente .html en la carpeta local de su ordenador. Los chunks (cajas de código) creados están vacíos o incompletos, de ahí que la mayoría de ellos tengan la opción #| eval: false. Una vez que edites lo que consideres, debes cambiar cada chunck a #| eval: true (o quitarla directamente) para ejecutarlos.
Recuerda que puedes ejecutar chunk a chunk con el botón play o ejecutar todos los chunks hasta un chunk determinado (con el botón a la izquierda del anterior)
Sólo se evaluará el archivo .html generado.
Paquetes requiridos
Necesitaremos los siguientes paquetes (toca en el trozo para cargarlos; instala EN LA CONSOLA los que no tengas antes):
rm(list =ls())library(tidyverse)
Warning: package 'ggplot2' was built under R version 4.2.3
Warning: package 'tibble' was built under R version 4.2.3
Warning: package 'tidyr' was built under R version 4.2.3
Warning: package 'readr' was built under R version 4.2.3
Warning: package 'purrr' was built under R version 4.2.3
Warning: package 'dplyr' was built under R version 4.2.3
Warning: package 'stringr' was built under R version 4.2.3
Warning: package 'lubridate' was built under R version 4.2.3
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.4 ✔ readr 2.1.5
✔ forcats 1.0.0 ✔ stringr 1.5.1
✔ ggplot2 3.5.1 ✔ tibble 3.2.1
✔ lubridate 1.9.3 ✔ tidyr 1.3.1
✔ purrr 1.0.2
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readxl)library(glue)
Caso práctico: análisis de los datos de covid-19
Pregunta 1
En el proyecto tienes un archivo messy_covid_data.xlsx. Echa una vistazo a las diapositivas y al paquete {readxl} y carga correctamente el archivo
# Escribe el código que consideres.datos <-read_...(...)datos
El archivo recopila una sola variable: el número de casos diagnosticados de la covid-19. Los nombres de las columnas codifican el sexo (H hombres, M mujeres, NC ausente) y el grupo etario (0-9, 10-19, 20-29, 30-39, 40-49, 50-59, 60-69, 70-79, ≥80 años y NC como ausente).
Pregunta 2
Calcula el número de filas y columnas de la tabla. ¿Es tidydata? Echa un vistazo a las diapositivas y razona por qué si o por qué no (¿tienes una fila por observación y una variable por columna?)
# Escribe el código que consideres.
Escribe en texto tu respuesta y razonamiento
Pregunta 3
Sabiendo que hay 52 provincias en España (contando Ceuta y Melilla), ¿Hay datos de todas ellas? ¿Qué no cuadra?
# Escribe el código que consideres.length(...)
Escribe en texto tu respuesta y razonamiento
Pregunta 4
Con lo que hayas deducido que esté mal del ejercicio anterior, ejecuta el código que consideres para arreglarlo.
# Escribe el código que consideres.datos <- datos |>mutate("provincia_iso"= ...)
Escribe en texto tu respuesta y razonamiento
Pregunta 5
¿De qué fecha es el dato más reciente? ¿Y el más antiguo?
# Escribe el código que consideres.
Escribe en texto tu respuesta y razonamiento
Pregunta 6
En tidyverse podemos hacer operaciones por filas indicándoselo con rowwise() y c_across() (en lugar de across). Cambia el chunk inferior a #| eval: true (paciencia, tarda quizás un poco).
# Escribe el código que consideres.datos <- datos |>rowwise() |>mutate("total"=sum(c_across(-c(provincia_iso, fecha)))) |>ungroup()
Fíjate que si hubiésemos hecho mutate("total" = across(-c(provincia_iso, fecha), sum)) nos estaría creando una columna por variable con la suma (¡por filas!), en lugar de coger toda la fila y sumarla para tener un total por filas
Con el chunk anterior ejecutado, quédate solo con aquellas filas cuyo total sea superior 0 (es decir, que algo en la fila no sea 0). Tras ello elimina la variable "total" que habíamos creado en el chunck anterior
# Escribe el código que consideres.datos_modif <- datos |> ... |> ...
Escribe en texto tu respuesta y razonamiento
Pregunta 7
Si en la pregunta 2 decidiste que no era tidy data, echa un vistazo a las diapositivas para convertirlo a dicho formato (recuerda: TODO lo de tidyverse está pensando sobre la hipótesis de que el data está ok; sino lo está vamos a tener problemas). Tras ello quédate solo con aquellos registros cuyo número de casos sea superior a 0 (piensa que en realidad si en un día, provincia, tramo etario y sexo tengo 0 casos, en realidad es un ausente).
# Escribe el código que consideres.datos_tidy <- datos_modif |>pivot_...(cols = ..., ... ="edad_sexo", ... ="casos") |> ...
Pregunta 8
Sigue echano un vistazo a las diapositivas de tidy data: si te fijas ahora tenemos una variable que junta dos cosas: edad y sexo. Usa separate() para decirle que nos separe el tramo etario en una columna y el sexo en otra.
# Escribe el código que consideres.datos_tidy <- datos_tidy |>separate(...)
Pregunta 9
¿Cuántos registros tengo para cada sexo en la tabla? ¿Cuántos casos se reportaron para cada uno de ellos? (be careful: son preguntas distintas, piensa por qué)
# Escribe el código que consideres.
Escribe en texto tu respuesta y razonamiento
Pregunta 10
Ejecuta el código que consideres para responder a las siguientes preguntas
¿Cuáles fueron las 5 provincias con más casos en toda la pandemia?
¿Cuántos casos totales se reportaron para cada tramo etario?
¿Cuál fue el tramo etario con mayor número de casos reportados en La Rioja (LO)`?
¿Cuál fue el día con mayor número casos en mujeres en toda la pandemia?
Pregunta 11
Calcula una tabla resumen contando el número de casos por tramo etario y sexo. Expórtala a un .csv
# Escribe el código que consideresresumen <- datos_tidy |>...("casos"= ..., ...)
Pregunta 12
Si te fijas la tabla resumen que has obtenido tendría que tener 30 filas y 3 columnas: tantas filas como número de grupos etarios * número de modalidades distintas en sexo (10*3). Cambia #| eval: true el chunk de abajo para que veas que pasa si intentamos hacer así una tabla de frecuencias entre edad y sexo
table(resumen$edad, resumen$sexo)
Las tablas de frecuencia en R base son muy cómodas pero necesitamos que si, por ejemplo, se reportaron 1000 casos de 0-9 años en mujeres, en nuestra tabla tengamos literal esas 1000 filas (repetidas)
Para ello podemos usar uncount(variable) indicándole que variable vamos a usar para “desagrupar” la tabla: creará muchísimas filas, tantas como casos haya en cada tramo etario y edad (repetidas). Cambia #| eval: true el chunk de abajo para que veas que pasa
Con ese resumen_uncount() calcula las tabla de frecuencias que consideres para responder a las siguientes preguntas
¿Cuántos casos hubo en el tramo 10-19 años cuyo sexo no se reportó?
¿Qué porcentaje de hombres diagnósticas con la covid-19 tenía entre 40 y 49 años?
¿Qué porcentaje de personas mayores de 80 años eran mujeres? ¿Se te ocurre alguna explicación plausible de por qué?
# Escribe el código que consideres
Pregunta 13
¿Existe evidencias suficientes en la muestra para establecer una asociación entre el sexo y el grupo etario?
# Escribe el código que consideres.
Escribe en texto tu respuesta y razonamiento
Pregunta 14
Preprocesa datos_tidy como consideres para poder realizar (y realiza) la gráfica inferior
# Escribe el código que consideres.
Pregunta 15
Haciendo uso de resumen, ¿cómo podríamos visualizar en el mismo gráfico el número de casos por edad y sexo, de manera que para cada tramo etario podamos comparar los casos por sexo? Personaliza todo lo que puedas
# Escribe el código que consideres.ggplot(resumen) +geom_col(aes(...), position = ...) + ...
Pregunta 16
Preprocesa datos_tidy como consideres para poder visualizar la evolución temporal de los casos de covid (eje x fecha, eje y casos). Tras ello ejecuta el código que consideres para visualizarlo
# Escribe el código que consideres.
Pregunta 17
Preprocesa datos_tidy para obtener un resumen con la suma de casos por fecha y sexo. Tras ello crea una nueva columna llamada “percentile” que guarde el percentile de cada día por sexo (es decir percentiles para hombres y percentiles para mujeres). Pista: busca la ayuda de percent_rank(). Tras ello elimina los atípicos (5% más extremo por debajo y 5% más extremo por arriba). Tras ello realiza un boxplot que visualice la distribución de casos para cada uno de los sexos
Lo prometido es deuda: os dejamos un ejemplo de cómo usar el paquete {ggpubr} (ver https://rpkgs.datanovia.com/ggpubr/) para visualizar gráficos con la significación (***) y el p-valor. En este caso hemos hecho un contraste Kruskal-Wallis, una prueba no paramétrica (¡no necesitamos normalidad en los datos!) para ver si un grupo de datos proviene de la misma población. Intuitivamente, es idéntico al ANOVA con los datos reemplazados por categorías. Es una extensión de la prueba de la U de Mann-Whitney para 3 o más grupos.
# Escribe el código que consideres.library(ggpubr)# con p-valoresggboxplot(resumen2, x ="sexo", y ="casos",color ="sexo", shape ="sexo",palette =c("#00AFBB", "#E7B800", "#FC4E07")) +stat_compare_means(comparisons =list( c("H", "M"), c("H", "NC"), c("M", "NC") )) +stat_compare_means(label.y =85000) # con ****ggboxplot(resumen2, x ="sexo", y ="casos",color ="sexo", shape ="sexo",palette =c("#00AFBB", "#E7B800", "#FC4E07")) +stat_compare_means(comparisons =list( c("H", "M"), c("H", "NC"), c("M", "NC") ), label ="p.signif") +stat_compare_means(label.y =85000)